// let person = {
//     name: '张三',
//     age: 18

// }
// // proxy 支持 数组、对象、函数、map、set、weakMap、weakSet
// let personProxy = new Proxy(person, {
//     // get 拦截取值操作
//     get(target, key) {
//         return target[key];
//     },
//     // set 拦截赋值操作
//     set(target, key, value, receiver) {
//         target[key] = value;
//         return true;
//     },
//     // apply 拦截函数调用
//     apply() {

//     },
//     // has 拦截 in 操作符
//     has() {

//     },
//     // ownKeys 拦截 for in 操作符
//     ownKeys() {

//     },
//     // constructor 拦截 new 操作符
//     construct() {

//     },
//     // deleteProperty 拦截 delete 操作符
//     deleteProperty() {

//     },
// });

let person = { name: '张三' , age: 10}
let personProxy = new Proxy(person, {
    get(target, key, receiver) {
        if (target.age < 18) {
            return Reflect.get(target, key, receiver);
        } else {
            return '18岁以上'
        }
    }
})
console.log(personProxy.age);



// 观察者模式
const list: Set<Function> = new Set();

const autorun = (cb: Function) => {
    if (!list.has(cb)) {
        list.add(cb);
    }
}
const observable = <T extends object>(params: T) => {
    return new Proxy(params, {
        get(target, key, receiver) {
            return Reflect.get(target, key, receiver);
        },
        set(target, key, value, receiver) {
            const result = Reflect.set(target, key, value, receiver);
            list.forEach(fn => fn())
            return result;
        }
    })
}

const personObserver = observable({ name: '张三' })

autorun(() => {
    console.log('personObserver------属性值改变了')
})
personObserver.name = '张三三'